﻿using Accountant.MySerializer;
using Accountant.Utils;

namespace Accountant.DataModel
{
  public class DbInitializer : IDatabaseInitializer<AccountantContext>
  {
    public void InitializeDatabase(AccountantContext context)
    {
      var brb = context.Currencies.Add(new Currency { Name = "BYR", Comment = "Белорусский рубль", Symbol = "р.",  SymbolPosition = SymbolPosition.Append  });
      var usd = context.Currencies.Add(new Currency { Name = "USD", Comment = "Доллар США",        Symbol = "$",   SymbolPosition = SymbolPosition.Prepend });
      var eur = context.Currencies.Add(new Currency { Name = "EUR", Comment = "Евро",              Symbol = "€",   SymbolPosition = SymbolPosition.Prepend });
                context.Currencies.Add(new Currency { Name = "RUR", Comment = "Российский рубль",  Symbol = "рр.", SymbolPosition = SymbolPosition.Append  });

      var all = context.Accounts.Add(new Account {Name = "Все", IsAbstract = true });
      var assets = context.Accounts.Add(new Account { BaseAccount = all, Name = "Активы", IsAbstract = true, Comment = "Деньги в кошельке, в тумбочке, на карточке, на депозите; квартира, машина, мебель", });
      var liability = context.Accounts.Add(new Account { BaseAccount = all, Name = "Пассивы", IsAbstract = true, IsHidden = true, Comment = "Деньги взятые в долг", });
      var income = context.Accounts.Add(new Account { BaseAccount = all, Name = "Доходы", IsAbstract = true, Comment = "Зарплата, дивиденды, найденный на дороге кошелек", });
      var expenses = context.Accounts.Add(new Account { BaseAccount = all, Name = "Расходы", IsAbstract = true, Comment = "Оплата коммунальных услуг, покупка еды.", });
      var equity = context.Accounts.Add(new Account { BaseAccount = all, Name = "Капитал", IsAbstract = true, IsHidden = true, Comment = "См. \"Капитальный Счет\" в википедии", });
      context.Accounts.Add(new Account { BaseAccount = equity, Name = "Начальный капитал", Comment = "С этого счета приходят суммы принятые для учета в программе", });
      context.Accounts.Add(new Account { BaseAccount = all, Name = "Обмен валют", Comment = "На этот счет суммы поступают в одной валюте и сразу уходят в другой", });
      context.Accounts.Add(new Account { BaseAccount = all, Name = "Cache",  IsHidden = true, Comment = "На этот счет периодически переводятся дебеты и кредиты всех остальных счетов, ради кеширования доступа к транзакциям" });
      context.Accounts.Add(new Account { BaseAccount = all, Name = "Reserved1", IsHidden = true, Comment = "Зарезервировали Id на будующее" });
      context.Accounts.Add(new Account { BaseAccount = all, Name = "Reserved2", IsHidden = true, Comment = "Зарезервировали Id на будующее", });
      context.Accounts.Add(new Account { BaseAccount = all, Name = "Reserved3",IsHidden = true, Comment = "Зарезервировали Id на будующее", });
      
      expenses.DerivedAccounts.AddRange(
        context.Accounts.Add(new Account { Name = "Продукты", PrimaryCurrency = brb }),
        context.Accounts.Add(new Account { Name = "Коммунальные расходы", PrimaryCurrency = brb, IsPrimaryCurrencyExclusive = true }),
        context.Accounts.Add(new Account { Name = "Арендная плата", PrimaryCurrency = brb, IsPrimaryCurrencyExclusive = true }),
        context.Accounts.Add(new Account { Name = "Одежда", PrimaryCurrency = brb, }),
        context.Accounts.Add(new Account { Name = "Бытовая техника", PrimaryCurrency = brb, }),
        context.Accounts.Add(new Account { Name = "Компьютер", PrimaryCurrency = usd, }),
        context.Accounts.Add(new Account { Name = "Лекарства", PrimaryCurrency = brb, }),
        context.Accounts.Add(new Account { Name = "Прочие расходы", PrimaryCurrency = brb, }));

      income.DerivedAccounts.AddRange(
        context.Accounts.Add(new Account {Name = "Моя зарплата",}),
        context.Accounts.Add(new Account {Name = "Подарки",}),
        context.Accounts.Add(new Account {Name = "Прочие доходы",}));
      
      assets.DerivedAccounts.AddRange(
        context.Accounts.Add(new Account { Name = "Кошелек", PrimaryCurrency = brb, }),
        context.Accounts.Add(new Account { Name = "Тумбочка", }),
        context.Accounts.Add(new Account { Name = "Карточка белинвестбанка", PrimaryCurrency = brb, IsPrimaryCurrencyExclusive = true }),
        context.Accounts.Add(new Account { Name = "Депозиты", IsAbstract = true, DerivedAccounts =
            {
              new Account { Name = "Долларовый депозит в приорбанке", PrimaryCurrency = usd, IsPrimaryCurrencyExclusive = true },
              new Account { Name = "Евро депозит в приорбанке",  PrimaryCurrency = eur, IsPrimaryCurrencyExclusive = true },
            }}));

      liability.DerivedAccounts.AddRange(
        context.Accounts.Add(new Account { Name = "Долг перед частными лицами"}));

      context.SaveChanges();
    }
  }
}